// 需求: 封装一个函数, 接受两个参数, 一个是数组的长度, 一个是数组内填充的内容, 这个函数根据两个形参创建出来一个数组, 然后返回出来

// 1. 初始版
// function createArr(length, value) {
//     // 根据 形参创建出来一个数组
//     const arr = [];
//     for (let i = 0; i < length; i++) {
//         arr.push(value);
//     }
//     return arr;
// }

// 2. 添加 ts 类型校验
// function createArr(length: number, value: any): any[] {
//     // 根据 形参创建出来一个数组
//     const arr: any[] = [];
//     for (let i = 0; i < length; i++) {
//         arr.push(value);
//     }
//     return arr;
// }

// const arr1 = createArr(3, "数组填充");
// console.log(arr1); // ['数组填充', '数组填充', '数组填充']

// const arr2 = createArr(5, true);
// console.log(arr2); // [true, true, true, true, true]

// const arr3 = createArr(2, 10086);
// console.log(arr3); // [10086, 10086]

// const arr4 = createArr(3, { text: "对象用于填充数组" });
// console.log(arr4)

// 3. 利用泛型优化上述代码
function createArr<T>(length: number, value: T): T[] {
    // 根据 形参创建出来一个数组
    const arr: T[] = [];
    for (let i = 0; i < length; i++) {
        arr.push(value);
    }
    return arr;
}

const arr1: string[] = createArr<string>(3, "数组填充");
console.log(arr1); // ['数组填充', '数组填充', '数组填充']

const arr2: boolean[] = createArr<boolean>(5, true);
console.log(arr2); // [true, true, true, true, true]

const arr3: number[] = createArr<number>(2, 10086);
console.log(arr3); // [10086, 10086]

interface IObj {
    text: string;
}
const arr4: IObj[] = createArr<IObj>(3, { text: "对象用于填充数组" });
// const arr4: { text: string }[] = createArr<{ text: string }>(3, { text: "对象用于填充数组" });
console.log(arr4);
